/**
 * 微信小程序授权认证逻辑
 */

import { ApiWxUserLogin } from "@/api/auth";
import Taro from "@tarojs/taro";
import { getUserInfo } from "@/lib/auth";

/**
 * 本地缓存微信用户信息的key
 */
export const WECHART_USERINFO = "wechartUserInfo";

/**
 * 获取用户token, 并获取用户信息
 * @returns
 */
export const getAuthToken = () => {
  return new Promise((resolve, reject) => {
    Taro.login({
      success: (res) => {
        ApiWxUserLogin({
          code: res.code,
          appId: process.env.APPID,
        })
          .then((response) => {
            getUserInfo({
              token: response.data.content.token,
              exipreTime: response.data.content.exipreTime,
            });
            resolve(true);
          })
          .catch((error) => {
            Taro.showToast({
              title: error?.msg || "登录失败",
              icon: "none",
              duration: 2000,
            });
            reject();
          });
      },
      fail: () => {
        reject();
      },
    });
  });
};

/**
 * 授权手机号并登录
 * @returns
 */
export const getPhoneNumber = (e, callback) => {
  return new Promise((resolve, reject) => {
    Taro.login({
      success: (r) => {
        ApiWxUserLogin({
          code: r.code,
          appId: process.env.APPID,
        })
          .then((login) => {
            console.log("ApiWxUserLogin login", login);
            const { token, exipreTime } = login.content;
            getUserInfo({ token, exipreTime, callback });
            resolve(token);
          })
          .catch((error) => {
            Taro.showToast({
              title: error?.msg || "登录失败",
              icon: "none",
              duration: 2000,
            });
            reject(error);
          });
      },
      fail: () => {
        reject();
      },
    });
  });
};

/**
 * 保存到相册
 */
export const handleSaveToAlbum = (image, { local, arraybuffer }: any = {}) => {
  if (arraybuffer) {
    Taro.showLoading({
      title: "加载中",
      duration: 0,
    });
    Taro.request({
      url: image, // 二进制文件远程资源链接
      responseType: "arraybuffer",
      success: (res) => {
        // 创建文件管理器
        const mannger = Taro.getFileSystemManager();
        // 命名地址 注意 我这里是字节小程序的地址 微信的地址可以把'ttfile://user/'换为 Taro.env.USER_DATA_PATH
        // 因为是图片所以我直接写为.jpg    应该需要判断文件类型
        const getTime = new Date().getTime();
        const filePath = `${Taro.env.USER_DATA_PATH}/${getTime}.png`;
        // 写入文件
        mannger.writeFile({
          filePath, // 写入临时文件的地址
          data: res.data, // 二进制码
          encoding: "base64", // 写入格式，因为是图片 pdf的话写utf8
          success(_res) {
            // 图片保存
            init(filePath);
          },
        });
      },
    });
    return;
  }
  console.log("保存到相册", image, local);
  function init(file) {
    // 生产环境时 记得这里要加入获取相册授权的代码
    // 可以通过 Taro.getSetting 先查询一下用户是否授权了 "scope.writePhotosAlbum" 这个 scope
    Taro.getSetting({
      success(res) {
        if (!res.authSetting["scope.writePhotosAlbum"]) {
          Taro.authorize({
            scope: "scope.writePhotosAlbum",
            success() {
              // 用户已经同意小程序相册功能，后续调用 Taro.saveImageToPhotosAlbum 接口不会弹窗询问
              startSaveImage(file);
            },
            fail(e) {
              Taro.showToast({
                title:
                  '您未授权，请点击右上角"..."三个点，进入"设置"，允许"添加到相册"',
                icon: "none",
                duration: 4000,
              });
            },
          });
        } else {
          startSaveImage(file);
        }
      },
      finally() {
        Taro.hideLoading();
      },
    });
  }
  Taro.showLoading({
    title: "加载中",
    duration: 0,
  });
  if (local) {
    init(image);
    return;
  }
  Taro.downloadFile({
    url: image, // 图片地址
    success(imageRes) {
      init(imageRes.tempFilePath);
      Taro.hideLoading();
    },
    fail() {
      Taro.showToast({
        title: `图片下载失败，图片路径：${image}`,
        icon: "none",
        duration: 4000,
      });
      Taro.hideLoading();
    },
  });
};
const startSaveImage = (tempFilePath) => {
  Log.log("保存到相册startSaveImage", tempFilePath);
  Taro.saveImageToPhotosAlbum({
    filePath: tempFilePath,
    success() {
      Taro.showToast({
        title: `保存成功`,
        icon: "success",
        duration: 4000,
      });
    },
    fail() {
      Taro.hideLoading();
    },
  });
};

/**
 * 版本比较
 * @param {}
 * @return
 */
export function compareVersion(v1) {
  if (process.env.TARO_ENV !== "weapp") return;

  let v2 = Taro.getSystemInfoSync().SDKVersion;
  console.log("比较版本", v1);
  console.log("当前环境版本", v2);
  v1 = v1.split(".");
  v2 = v2.split(".");
  const len = Math.max(v1.length, v2.length);

  while (v1.length < len) {
    v1.push("0");
  }
  while (v2.length < len) {
    v2.push("0");
  }

  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i], 10);
    const num2 = parseInt(v2[i], 10);

    if (num1 > num2) {
      return 1;
    } else if (num1 < num2) {
      return -1;
    }
  }

  return 0;
}
